package compi;

import java.io.*;

import data.Token;
import data.TipoToken;
import exceptions.EOF;

public class LectorTokens 
{
	private Token _token;
	private Analex _analex;
	private int _errorCount;
	
	public LectorTokens(String nom_fich) throws FileNotFoundException
	{
		_analex = new Analex(nom_fich);
		_token = null;
		_errorCount = 0;
	}

	/**
	 * nextToken
	 * @return siguiente token usable
	 */
	public Token nextToken()
	{

		try {
			_analex.nextToken();
			_token = new Token(_analex.tipoToken(), _analex.nombreToken());
			
			// Descartar y mostrar errores
			if ( _token.getType() == TipoToken.ERROR )
			{
				mostrarError();
				_errorCount++;
				nextToken();
			}
			else if ( _token.getType() == TipoToken.COMMENTS )
				nextToken();
			
		}
		catch (EOF e) 
		{
			if ( _analex.estadoComentario(_analex.estado()) )
			{
				System.err.println("("+ _analex.inicioComentario() 
						+") Error: fin de fichero inesperado.");
				_errorCount++;
			}
			else
				System.err.println("Error: fin de fichero inesperado.");
			System.exit(1);
		}
		catch (IOException exception) {
			System.err.println("Error al leer/escribir del fichero");
			_errorCount++;
			System.exit(1);
		}

		return _token;
	}


	/**
	 * numLinea
	 * @return
	 */
	public int numLinea() 
	{
		return _analex.numLinea();
	}
	
	/**
	 * mostrarError
	 */
	private void mostrarError()
	{
		System.err.println("(" + numLinea() + "): Error lexico en `" + _token.getContent() + "`");
	}

	/**
	 * getErrorCount
	 * @return
	 */
	public int getErrorCount()
	{
		return _errorCount;
	}
	
	/**
	 * retroceder
	 */
	public void retroceder()
	{
		_analex.retroceder();
	}
}